#include "xbitmap.h"

XBitmap::XBitmap()
{
    m_img_path = "";
    m_mt = 0;
    m_nt = 0;
    m_buf_size = 0;
    m_buf = NULL;
}

QString XBitmap::get_img_path()
{
    return m_img_path;
}

unsigned long XBitmap::get_mt()
{
    return m_mt;
}

unsigned long XBitmap::get_nt()
{
    return m_nt;
}

unsigned long XBitmap::get_buf_size()
{
    return m_buf_size;
}

char * XBitmap::get_buf()
{
    return m_buf;
}
/**********************************************
 * 加载一个BMP文件进入内存
 * 如果该文件名为空，则返回-1
 * 如果该文件不存在则返回-2
 * 如果该文件无法打开则返回-3
 * 如果该文件不是24位真彩色BMP文件则返回-4
 * 如果文件的大小不等于文件头大小+信息头大小+数据区大小则返回-5
 * 即，必须保证该文件是且仅是24位真彩色BMP文件，并且不能包含调色板。
 * 否则，将拒绝处理！
 **********************************************/
int XBitmap::load_img_file(QString img_path)
{
    // 如果文件名为空
    if(img_path.isEmpty() || img_path.isNull()){
        return -1;
    }

    QFile img_file(img_path);

    // 如果文件不存在
    if(!img_file.exists()){
        return -2;
    }

    // 如果文件无法打开
    if (!img_file.open(QIODevice::ReadOnly)) {
        return -3;
    }

    BITMAPFILEHEADER bfh;
    img_file.read((char*)&bfh, sizeof(BITMAPFILEHEADER));

    BITMAPINFOHEADER bih;
    img_file.read((char*)&bih, sizeof(BITMAPINFOHEADER));

    if (bih.biBitCount != 24) return -4;

    unsigned long mt = abs(bih.biHeight);
    unsigned long nt = abs(bih.biWidth);
    unsigned long line_size = nt * (bih.biBitCount/8);
    unsigned long buf_size = line_size * mt;

    if (bfh.bfSize != (sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + buf_size)) return -5;

    m_mt = mt;
    m_nt = nt;
    m_buf_size = buf_size;

    img_file.seek(bfh.bfOffBits);

    if(!m_buf) {delete m_buf; m_buf = NULL;}
    m_buf = new char[m_buf_size];
    char * line_buf = NULL;
    line_buf = new char[line_size];

    for(unsigned long m = 0; m < m_mt; m++){
        img_file.read(line_buf,line_size);
        unsigned int mc = 0;
        if(bih.biHeight > 0){
            mc = m_mt - 1 - m;
        } else {
            mc = m;
        }
        memcpy((void*)(m_buf+(mc * line_size)),(void*)line_buf,line_size);
    }

    img_file.close();

    m_img_path = img_path;

    return 0;
}
